Java final 与 C++ const
全部标签 为什么我不能将constint*cp1放在赋值的右侧?请看这个样本intx1=1;intx2=2;int*p1=&x1;int*p2=&x2;constint*cp1=p1;p2=p1;//Compilesfinep2=cp1;//===>ComplilationError为什么我在指示的位置出现错误?毕竟我不想更改一个常量值,我只是想使用一个常量值。我是不是漏掉了什么。 最佳答案 AfterallIamnottryingtochangeaconstantvalue从“指向const的指针”到“指向非常量的指针”的隐式转换是不允许的
例如有一个函数在做某事。我应该如何在函数中声明和定义一个数组,我只想分配/初始化一次?voidsomeclass::somefunction(/*parametershere*/){staticconstmy_array[4]={1,2,3,4};//#1/*orjust*/constmy_array[4]={1,2,3,4};//#2}据我所知,在案例#1中,“my_array”将在数据段中分配,并在第一次调用“somefunction”时初始化一次。但是我的一位同事假设情况#2以相同的方式工作,并且不需要写“static”关键字。所以我想问一下标准是否对案例#1和#2做了一些说明,
刚刚问了一个类似的问题,归结为这个问题。#includeusingnamespacestd;structA{A():a{1}{};inta;};templatestructWhichType;intmain(){constAa;constA&a_ref=a;constA*a_ptr=&a;WhichTypewhich_obj;//templateevaluatestointWhichTypewhich_ref;//templateevaluatestointWhichTypea)>which_ptr;//templateevaluatestointreturn0;}为什么模板没有变成c
对于下面的代码片段,它显示了方法中不同的引用计数。有人可以解释为什么这些值不同吗?classFoo{};voidf1(conststd::shared_ptr&ptr){std::cout&ptr){std::coutptr(newFoo);std::cout对应的输出:main():counts:1f1():counts:1f2():counts:2main():counts:1 最佳答案 请注意std::shared_ptr和std::shared_ptr是不同的类型(即具有不同模板类型参数的类模板实例化是不同的类型)。当你通过
给定这样一个类:classFoo{constinta;};是否可以将该类放入vector中?当我尝试时,我的编译器告诉我它不能使用默认赋值运算符。我尝试自己编写,但谷歌搜索告诉我不可能为具有const数据成员的类编写赋值运算符。我发现的一篇帖子说“如果你将[数据成员]设置为const,这意味着你不希望首先发生赋值。”这是有道理的。我已经编写了一个包含const数据成员的类,但我从未打算对其使用赋值,但显然我需要赋值才能将其放入vector中。有没有办法解决这个问题仍然保持常量正确性? 最佳答案 I'vewrittenaclasswi
T*p=newT();对于堆上的指针,可能会有灾难性的操作,例如,p++;//(1)scopemissedp=newT();//(2)re-assignment错误的delete会导致内存泄漏或崩溃。除了使用智能指针,是否建议总是使堆指针成为const;T*constp=newT();//now"p"isnotmodifiable这个问题与保持良好的编程习惯和编码风格有关。 最佳答案 嗯,我唯一一次使用原始堆指针是在编写我自己的数据结构时。如果您为它们使用const指针,您的数据结构将立即变得不可分配。这可能是也可能不是你想要的。
///////////////////////////////////////classA{...constdoublefunA(void){...}};Aa;doublex=a.funA();//althoughtheintentionisto//enforcethereturnvaluetobeconstandcannotbe//modified,ithaslittleeffectintherealworld.classA2{...doublefunB(void){...}};///////////////////////////////////////classA{voidset
以下将compile即使const成员函数会修改成员的值。怎么会这样?#includestructfoo{std::string&str;foo(std::string&other):str(other){}voidoperator()(std::string&some)const{str+=some;}};intmain(){std::stringext("Hello");fooa{ext};std::stringmore("world!");a(more);cout 最佳答案 将引用视为经典指针:#includestructfo
如果是这样,为什么一些Win32header使用它?例如:BOOLAPIENTRYVerQueryValueA(constLPVOIDpBlock,LPSTRlpSubBlock,LPVOID*lplpBuffer,PUINTpuLen);更详细一点:如果API从不使用引用(或任何其他仅C++构造)而仅使用指针和值,那么使用constLPVOID与LPCVOID有什么意义。我是否应该将每个看到constLPVOID的地方都视为真正意义是LPCVOID的地方?(因此添加类型转换是安全的)进一步澄清:在这种情况下,constLPVOIDpBlock似乎确实是一个错误。Windows2008
是否有任何g++选项可以检测到带有NULLconstchar*的std::string的不正确初始化?我正在将一些int字段转换为std::string字段,即:structFoo{intid;Foo():id(0){}};...变成了:structFoo{std::stringid;Foo():id(0){}//oooops!};我完全忽略了使用0进行的错误“id”初始化,而g++根本没有给我任何警告。这个错误是在运行时检测到的(std::string构造函数抛出异常),但我真的很想在编译时检测到这些东西。有什么办法吗? 最佳答案